/*
 * Copyright (c) 2017. 恒昌互联网运营中心.
 */

package com.credithc.eagleeye.thread;
import org.apache.commons.lang3.time.StopWatch;

import java.util.HashMap;
import java.util.Map;
/**
 * 描 述: 线程执行的上下文内容<br/>
 * 作 者: zhangjin<br/>
 * 创 建：2016年06月01日<br/>
 * 版 本：v1.0.0<br>
 * <p/>
 * 历 史: (版本) 作者 时间 注释 <br/>
 */
public class EagleEyeThreadContext {
    /**
     * 线程上下文变量的持有者
     */
    private final static ThreadLocal<Map<String, Object>> CTX_HOLDER = new ThreadLocal<Map<String, Object>>();

    static {
        CTX_HOLDER.set(new HashMap<String, Object>());
    }

    /**
     * 添加内容到线程上下文中
     *
     * @param key
     * @param value
     */
    public final static void putContext(String key, Object value) {
        Map<String, Object> ctx = CTX_HOLDER.get();
        if (ctx == null) {
            return;
        }
        ctx.put(key, value);
    }

    /**
     * 从线程上下文中获取内容
     *
     * @param key
     */
    @SuppressWarnings("unchecked")
    public final static <T extends Object> T getContext(String key) {
        Map<String, Object> ctx = CTX_HOLDER.get();
        if (ctx == null) {
            return null;
        }
        return (T) ctx.get(key);
    }

    /**
     * 获取线程上下文
     *
     */
    public final static Map<String, Object> getContext() {
        Map<String, Object> ctx = CTX_HOLDER.get();
        if (ctx == null) {
            return null;
        }
        return ctx;
    }

    /**
     * 删除上下文中的key
     *
     * @param key
     */
    public final static void remove(String key) {
        Map<String, Object> ctx = CTX_HOLDER.get();
        if (ctx != null) {
            ctx.remove(key);
        }
    }

    /**
     * 上下文中是否包含此key
     *
     * @param key
     * @return
     */
    public final static boolean contains(String key) {
        Map<String, Object> ctx = CTX_HOLDER.get();
        if (ctx != null) {
            return ctx.containsKey(key);
        }
        return false;
    }

    /**
     * 清空线程上下文
     */
    public final static void clean() {
        CTX_HOLDER.set(null);
    }

    /**
     * 初始化线程上下文
     */
    public final static void init() {
        CTX_HOLDER.set(new HashMap<String, Object>());
    }


    /**
     * 设置调用栈信息
     * @param traceInfo
     */
    public final static void putTraceInfo(TraceInfo traceInfo) {
        putContext(TRACE_INFO_KEY, traceInfo);
    }

    /**
     * 获取调用栈信息
     */
    public final static TraceInfo getTraceInfo() {
        return getContext(TRACE_INFO_KEY);
    }

    /**
     * 删除调用栈信息
     */
    public final static void removeTraceInfo() {
        remove(TRACE_INFO_KEY);
    }


    /**
     * 调用栈信息
     */
    private final static String TRACE_INFO_KEY = "traceInfo";

    /**
     * 调用时间
     */
    private final static String STOP_WATCH_KEY_FORMAT = "watch_%s";

    /**
     * 开始服务计时器
     */
    public final static void startWatch(String serviceName) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        putContext(String.format(STOP_WATCH_KEY_FORMAT,serviceName),stopWatch);
    }
    /**
     * 结束服务计时器
     */
    public final static long stopWatch(String serviceName){
        String key = String.format(STOP_WATCH_KEY_FORMAT, serviceName);
        StopWatch stopWatch = getContext(key);
        if (stopWatch != null) {
            stopWatch.stop();
            return stopWatch.getTime();
        }
        return 0;
    }
}
